//进程池思路：master_slave模式，一个父进程通过匿名管道控制多个子进程 
// 匿名管道如何实现控制？父进程作为写端不写，但写端不关，读端读时就会阻塞
// 如何构建整个结构？先描述，再组织。
// 父进程与每一个独立的子进程间都需要用一个独立的匿名管道进行通信，即需要一个独立的信道，所以我们要去描述这个信道？
// 如何描述这个信道？父进程通过这个信道向子进程发送消息，所以这个信道应该具备：1.父进程的写端fd  2.目标子进程的pid  3.匿名管道的名称
// 描述完成之后，再组织，使用一个简单的顺序表将进程池中的所有信道管理起来->这样形成的结构就是我们的进程池

#include "ProcessPool.hpp"

int main()
{
    ProcessPool pp;
    //使用lambda表达式
    pp.InitProcessPool([](int fd)
    {
        while(true)
        {
            //子进程获取信息
            int code = 0;//一个整型4字节的任务码
            int n = read(fd,&code,sizeof(code));
            if(n > 0)
            {
                if(n == sizeof(code))
                {
                    //获取正确的任务码，子进程执行任务
                    tasks[code]();
                }
                else
                {
                    std::cout << "父进程给我的任务码错误" << std::endl;
                }
            }
            else if(n == 0)
            {
                std::cout << "父进程关闭信道写端，子进程退出" << std::endl;
                break;
            }
            else
            {
                perror("read");
                break;
            }
        }
    }
    );
    
    pp.ControlSubProcess(10);
    
    pp.DestroyProcessPool();
    return 0;
}